package com.example.photo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.photo.common.ErrorCode;
import com.example.photo.exception.BusinessException;
import com.example.photo.mapper.WorkMapper;
import com.example.photo.model.VO.ScoreWorkVO;
import com.example.photo.model.VO.WorkVO;
import com.example.photo.model.domain.Work;
import com.example.photo.model.request.add.NewWorkRequest;
import com.example.photo.model.request.update.UpdateWorkRequest;
import com.example.photo.service.UserService;
import com.example.photo.service.WorkService;
import com.example.photo.utils.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 85792
 * @description 针对表【work(作品)】的数据库操作Service实现
 * @createDate 2023-03-25 19:15:44
 */
@Service
public class WorkServiceImpl extends ServiceImpl<WorkMapper, Work>
        implements WorkService {

    @Resource
    private WorkMapper workMapper;

    @Resource
    private UserService userService;

    /**
     * 保存用户作品
     *
     * @param newWorkRequest 上传的作品信息
     * @param userId         作者id
     * @return 作品详细信息
     */
    @Override
    public WorkVO saveWork(NewWorkRequest newWorkRequest, Integer userId) {
        Work work = new Work(newWorkRequest, userId);

        //给作品添加封面
        addCover(work);

        boolean save = this.save(work);
        if (!save) {
            throw new BusinessException(ErrorCode.SERVER_ERROR, "作品保存失败");
        }

        return new WorkVO(work);
    }

    //给作品添加封面文件
    private void addCover(Work work) {
        String workFile = work.getWorkFile();
        if (StringUtils.isNotBlank(workFile)) {
            String coverFile = FileUtils.getCover(workFile);
            work.setCoverFile(coverFile);
        }
    }

    /**
     * 给作品增加浏览量
     *
     * @param workId 作品id
     */
    @Override
    public void viewIncrement(Integer workId) {
        workMapper.viewIncrement(workId);
    }

    /**
     * 根据作者id查询其上传的所有作品
     *
     * @param makerId 作者id
     * @return 作品列表（没有则返回空列表）
     */
    @Override
    public List<WorkVO> getWorksByMarkerId(Integer makerId) {
        QueryWrapper<Work> wrapper = new QueryWrapper<>();
        wrapper.eq("maker_id", makerId);
        List<Work> works = workMapper.selectList(wrapper);
        //结果为空表示该用户暂无作品，返回空列表
        if (works.size() == 0) {
            return new ArrayList<>();
        }
        //设置作者头像
        String avatar = userService.getById(makerId).getAvatar();
        return works.stream()
                .map(WorkVO::new)
                .peek(userWorkVO -> userWorkVO.setMakerAvatar(avatar))
                .collect(Collectors.toList());
    }

    /**
     * 根据赛事id查询所有参赛作品
     *
     * @param contestId 赛事id
     * @return 作品列表（没有则返回空列表）
     */
    @Override
    public List<ScoreWorkVO> getAllWorksByContestId(Integer contestId) {
        QueryWrapper<Work> wrapper = new QueryWrapper<>();
        wrapper.eq("contest_id", contestId);
        List<Work> works = workMapper.selectList(wrapper);
        //结果为空表示当前赛事暂无参赛作品，返回空列表
        if (works.size() == 0) {
            return new ArrayList<>();
        }
        //设置作者头像（考虑作品表应加作者头像字段，否则查库次数有点多）
        return works.stream()
                .map(ScoreWorkVO::new)
                .collect(Collectors.toList());
    }

    /**
     * 用户修改上传的作品信息
     */
    @Override
    public WorkVO updateWorkInfo(UpdateWorkRequest updateWorkRequest) {
        Integer workId = updateWorkRequest.getWorkId();

        //如果用户提交了新的作品文件，需要同时更新封面文件
        Work newWork = new Work(updateWorkRequest);
        addCover(newWork);

        int update = workMapper.updateById(newWork);
        if (update < 1) {
            throw new BusinessException(ErrorCode.SERVER_ERROR, "修改作品信息失败");
        }
        //重新查询该作品信息并返回
        return new WorkVO(workMapper.selectById(workId));
    }

    /**
     * 批量审核作品
     *
     * @param workIds    要审核作品id列表
     * @param passStatus 作品状态标志位
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    @Override
    public void setIsPass(List<Integer> workIds, Integer passStatus) {
        for (Integer workId : workIds) {
            //判断是否存在
            QueryWrapper<Work> wrapper = new QueryWrapper<>();
            wrapper.eq("work_id", workId);
            boolean exists = workMapper.exists(wrapper);
            if (!exists) {
                throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "id为[" + workId + "]的作品不存在");
            }
        }
        workMapper.setIsPass(workIds, passStatus);
    }


}




